// api 接口统一输出
// ===== 代码: =====
// const $app = getApp() // 放在外面
// $app.$common.openLoading() // 开启加载
// const param = {}
// ···特殊
// $app.$api.xxxxx.xxxxx(param).then(({ data }) => {
//   console.log('api-xxxxx', data)
//   // ···
//   $app.$common.closeLoading() // 关闭加载
//   $app.$common.message('xxxxx', 'success') // 提示 success error warning info
// }).catch((res) => {})

// ===== 注: =====
// ※ code=1走的是[.catch], code=0|2走的是[.then], 接口请求失败不走[.catch]也不走[.then]

// ===== 特殊: =====
// ※ param['*'] = true ==> 自定义事件(code=1时), 不使用默认事件
//                          (注: 默认事件包括关闭加载和错误提示)
// ※ param['/'] = true ==> 自定义事件(请求失败fail时), 不使用默认事件
//                          (注: 默认事件包括关闭加载和错误提示)
//                          (注: .catch((res) => {})中res为对象: { type: 'error'/'fail', res: res })

const codeMessage = {
  400: '参数错误',
  401: '需要用户验证',
  403: '用户无权限',
  404: '资源不存在',
  405: '不支持的操作方法',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的',
  422: '当创建一个对象时，发生一个验证错误',
  500: '服务器内部错误！',
  502: '应用程序错误！',
  503: '服务不可用，维护中！',
  504: '网关超时！',
  505: '不支持HTTP版本！'
}

export const request = (url, param) => {
  let $app = getApp()
  const isOriginal = Boolean(param['+']) // 参数是否为原格式
  if (!isOriginal) {
    for (let k in param) {
      if (param[k] === null || param[k] === '') delete param[k]
    }
  }
  const isErrorEvent = Boolean(param['*'])
  const isFailEvent = Boolean(param['/'])
  return new Promise((resolve, reject) => {
    wx.request({
      url: $app.baseUrl + url,
      data: param || {},
      timeout: 10000,
      method: 'POST',
      success: (res) => {
        const { statusCode, errMsg, data } = res
        if (statusCode === 200) {
          if (data.code === 1) {
            if (isErrorEvent) {
              reject({ type: 'error', res })
            } else {
              const msg = data.message || '请求错误'
              console.log('api-请求错误error', msg, res)
              $app.$common.closeLoading() // 关闭加载
              $app.$common.message(msg, 'error') // 提示信息
            }
          } else {
            resolve(data)
          }
        } else {
          const msg = codeMessage[statusCode] || `${statusCode}：${errMsg}`
          if (isFailEvent) {
            reject({ type: 'fail', res })
          } else {
            console.log('api-请求失败fail-1', msg, res)
            $app.$common.closeLoading() // 打开加载
            $app.$common.message(msg, 'error') // 提示信息
          }
        }
      },
      fail: (res) => {
        if (isFailEvent) {
          reject({ type: 'fail', res })
        } else {
          console.log('api-请求失败fail-2', res)
          $app.$common.closeLoading() // 打开加载
          $app.$common.message('网络错误', 'error') // 提示信息
        }
      }
    })
  })
}